Q: OpenGL ÉRÉìÉeÉLÉXÉgÇÕǢǬÅAÇ»Ç∫çXêVÇ∑ÇÈïKóvǙdžÇÈÇÃÇ≈ǵÇÂǧǩÅH
A: OpenGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉhÉçÅ[ÉAÉuÉãÇÃÉWÉIÉÅÉgÉäÇ™ïœÇÌÇ¡ÇΩÇΔÇ´Ç‚ÅAÉåÉìÉ_ÉâÇ™ïœÇÌÇ¡ÇΩÇΔÇ´Ç… OpenGL ÉRÉìÉeÉLÉXÉgÇçXêVÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉEÉCÉìÉhÉEâªÇ≥ÇÍÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍçáÅAçXêVÇÕí èÌÅAíÒãüÇ≥ÇÍǃǢÇÈçXêV API Çà aglUpdateContext Ç‹ÇΩÇÕ NSOpenGLContext Çà -update ÉÅÉ\ÉbÉhÇí Ç∂ǃé¿çsÇ≥ÇÍÇ‹Ç∑ÅBÉtÉãÉXÉNÉäÅ[ÉìÉNÉâÉCÉAÉìÉgÇÃèÍçáÇÕÅAÉRÉìÉeÉLÉXÉgÇÃçXêVÇé¿çsÇ∑ÇÈÇ…ÇÕÅAçXêVä÷êîÇåƒÇ—èoÇ∑ë„ÇÌÇËÇ…ÅACGLSetFullScreen Ç‹ÇΩÇÕ aglSetFullScreen ÇÃåƒÇ—èoǵÇçƒî≠çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBëSëÃÇΔǵǃÅADZÇÍÇÁÇÃä÷êîÇ…ÇÊǡǃ OpenGL ÉGÉìÉWÉìÇÕÉTÅ[ÉtÉFÉCÉXÉTÉCÉYÇ™ê›íËÇ≥ÇÍÅAâºëzÉXÉNÉäÅ[ÉìÇÃïœçXÇ…çáÇÌÇπǃÉåÉìÉ_ÉâÇ™ê≥ǵÇ≠çXêVÇ≥ÇÍÇÈDZÇΔÇï€èÿÇ≈Ç´Ç‹Ç∑ÅBÉRÉìÉeÉLÉXÉgÇÃçXêVÇ…é∏îsÇ∑ÇÈÇΔÅAÉåÉìÉ_ÉäÉìÉOÇ™ïsé©ëRÇ…Ç»ÇÈÇ©ÅAOpenGL èoóÕÇ™äÆëSÇ…Ç»Ç≠Ç»ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBç≈å„Ç…ÅAÉRÉìÉeÉLÉXÉgçXêV API ÇÃégópÇÃïâíSÇÕè¨Ç≥Ç≠ǻǢÇÃÇ≈ÅAégÇ¢âflǨǻǢÇÊǧDžǵNjÇ∑ÅBÉNÉâÉCÉAÉìÉgÇÕÅAÉtÉåÅ[ÉÄÇ≤ÇΔÇ…çXêVÇî≠çsÇ∑ÇÈÇÃÇ≈ÇÕÇ»Ç≠ÅAÉVÉXÉeÉÄÉåÉxÉãÇÃÉCÉxÉìÉgÇΔí ímÇ…âûÇ∂ǃìKêÿÇ»ÉRÉìÉeÉLÉXÉgçXêVÇÃåƒÇ—èoǵÇçsǧDZÇΔÇã≠Ç≠Ç®ä©ÇflǵNjÇ∑ÅB
Ç‹ÇΩÅAÉhÉçÅ[ÉAÉuÉãÇÃÉWÉIÉÅÉgÉäÇ‹ÇΩÇÕåªç›ÇÃÉåÉìÉ_ÉâÇ…âeãøÇó^ǶÇÈÉAÉNÉVÉáÉìÇÃdžÇΔDžLJÅAÉRÉìÉeÉLÉXÉgÇçXêVÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉVÉXÉeÉÄÉCÉxÉìÉgÇ≈ÇÕÅAÉhÉçÅ[ÉAÉuÉãÇÃà⁄ìÆÅAÉäÉTÉCÉYÅAç¿ïWÉIÉtÉZÉbÉgÅAÇ®ÇÊÇ—ÉfÉBÉXÉvÉåÉCê›íËÇÃïœçXÅiÉfÉBÉXÉvÉåÉCÇÃê[Ç≥ÇÃïœçXÅjǙǪǧǵÇΩÉAÉNÉVÉáÉìÇ…ëäìñǵNjÇ∑ÅBDZÇÍÇÁÇÃÉCÉxÉìÉgÇÃèàóùï˚ñ@ÇÕÅAégópǵǃǢÇÈÉNÉâÉCÉAÉìÉg API Ç…ÇÊǡǃåàÇ‹ÇËÇ‹Ç∑ÅBNSOpenGLView ÇÉTÉuÉNÉâÉXâªÇµÇƒÇ¢ÇÈ Cocoa ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅANSOpenGLView Çà -update ÉÅÉ\ÉbÉhÇé©ìÆìIÇ…åƒÇ—èoǵNjÇ∑ÅBGLUT ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ≈ÇÕÉRÉìÉeÉLÉXÉgÇÃçXêVÇ™ê≥ǵÇ≠èàóùÇ≥ÇÍÇÈDZÇΔÇ™ï€èÿÇ≥ÇÍǃǢÇÈÇΩÇflÅADZÇÍÇÕ GLUT ÉAÉvÉäÉPÅ[ÉVÉáÉìDžLJìKópÇ≥ÇÍÇ‹Ç∑ÅBCocoa Ç≈èëÇ©ÇÍǃǢÇÈÇØÇÍǫLJ NSOpenGLView ÇÉTÉuÉNÉâÉXâªÇµÇƒÇ¢Ç»Ç¢ÉNÉâÉCÉAÉìÉgÇÕÅANSOpenGLContext Çà -update ÉÅÉ\ÉbÉhÇíºê⁄égópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBAGL API ÇégÇ¡ÇΩÅAÉEÉCÉìÉhÉEâªÇ≥ÇÍǃǢÇÈ Carbon ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAaglUpdateContext ÇåƒÇ—èoÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBÉtÉãÉXÉNÉäÅ[ÉìÇà CGL Ç®ÇÊÇ— AGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍçáÇÕÅAÉNÉâÉCÉAÉìÉgÇÕçXêVä÷êîÇåƒÇ—èoÇ∑ÇÃÇ≈ÇÕÇ»Ç≠ÅAǪÇÍǺÇÍ CGLSetFullScreen ÇΔ aglSetFullScreen Ççƒî≠çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÁÇÕÅAê[Ç≥ÅAÉTÉCÉYÅAÉfÉBÉXÉvÉåÉCê›íËÇÃïœçXÇîΩâfÇ≥ÇπÇÈÇΩÇflÇ…ïKóvÇ≈Ç∑ÅBDZÇÍÇÁÇÃçXêVåƒÇ—èoǵÇÕÅAçXêVÇïKóvÇΔÇ∑ÇÈÉVÉXÉeÉÄÉCÉxÉìÉgÇÃdžÇΔÅAÉNÉâÉCÉAÉìÉgÇ™ÉRÉìÉeÉLÉXÉgÇ÷ÇÃï`âÊÇé¿çsÇ∑ÇÈëOÇ…çsǧïKóvǙdžÇËÇ‹Ç∑ÅBç≈å„Ç…ÅAÉNÉâÉCÉAÉìÉgÇà OpenGL ÉRÉìÉeÉìÉcÇêVǵǢÉhÉçÅ[ÉAÉuÉãÇÃÉTÉCÉYÇ…çáÇÌÇπǃê≥ǵÇ≠ägëÂÅ^èkè¨Ç∑ÇÈÇΩÇflÇ…ÉhÉçÅ[ÉAÉuÉãÇ™ÉäÉTÉCÉYÇ≥ÇÍÇÈèÍçáÇÕÅAglViewport ÉRÉ}ÉìÉhÇî≠çsÇ≈Ç´Ç‹Ç∑ÅBDZDZÇ≈ÇÕÅAǪÇÍǺÇÍÇÃÉPÅ[ÉXÇ≤ÇΔÇ…ÉRÅ[Éhó·Çå©ÇƒÇ¢Ç≠ÇÃÇ™ñÇ…óßÇøÇ‹Ç∑ÅB
íçÅF
ÉRÉìÉeÉLÉXÉgÇÃçXêVÇïKóvÇΔÇ∑ÇÈDZÇÍÇÁÇÃÉVÉXÉeÉÄÉåÉxÉãÉCÉxÉìÉgÇÃíÜÇ…ÇÕÅAÉRÉìÉeÉLÉXÉgÇÃÉoÉbÉtÉ@ÇäÑÇËìñǃíºÇ∑LJÇÃǙdžÇÈÇΩÇflÅAÇ∑Ç◊ǃÇÃÉRÉìÉeÉLÉXÉgÇçXêVǵÇΩå„Ç≈ÅAÉVÅ[ÉìëSëÃÇçƒï`âÊÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
|
Cocoa ÇÃ NSOpenGLView
NSOpenGLView ÇÉTÉuÉNÉâÉXâªÇµÇƒÇ¢ÇÈ Cocoa ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAèàóùÇ∑ÇÈïKóvÇÃdžÇÈ 4 ǬÇÃÇ∑Ç◊ǃÇÃÉPÅ[ÉXDžǮǢǃÅANSOpenGLView Çà -update ÉÅÉ\ÉbÉhÇ™é©ìÆìIÇ…åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBÉNÉâÉCÉAÉìÉgǙDZÇÃÉÅÉ\ÉbÉhÇÉIÅ[ÉoÅ[ÉâÉCÉhǵǃÉRÉìÉeÉLÉXÉgçXêVÉCÉxÉìÉgÇéÛÇØéÊÇËÇΩÇ¢èÍçáÇÕé©óRÇ…Ç≈Ç´Ç‹Ç∑Ç™ÅAé©êgÇÃÉRÅ[ÉhÇé¿çsÇ∑ÇÈëOÇ…ïKÇ∏ [super update] ÇåƒÇ—èoǵÅAÉRÉìÉeÉLÉXÉgÇ™çXêVÇê≥ǵÇ≠èàóùǵǃǢÇÈDZÇΔÇï€èÿÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÇ‹ÇΩÅAëOèqÇÃÇÊǧDžÅAÉNÉâÉCÉAÉìÉgÇÕ -update ÉÅÉ\ÉbÉhÇêTèdÇ…égópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÇ»Ç∫Ç»ÇÁÅADZÇÃÉÅÉ\ÉbÉhÇÕÉEÉCÉìÉhÉEÇÃÉhÉâÉbÉOéûÅAÉâÉCÉuÉäÉTÉCÉYíÜÇ…íËä˙ìIÇ…ÅAÇ®ÇÊÇ—ÉfÉBÉXÉvÉåÉCê›íËÇÃïœçXÇÃÇΩÇ—Ç…åƒÇ—èoÇ≥ÇÍÇÈÇΩÇflÅADZDZÇ≈ÇÃèàóùÇ™èdÇ≠Ç»ÇÈÇΔÅAÉEÉCÉìÉhÉEÇÃÉhÉâÉbÉOÇ‚ÉâÉCÉuÉäÉTÉCÉYÇÃÇΔÇ´Ç…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™îΩâûǵǃǢǻǢÇÊǧDžå©Ç¶ÇƒÇµÇ‹Ç§ÇΩÇflÇ≈Ç∑ÅB
Cocoa ÇÃÉJÉXÉ^ÉÄ OpenGL ÉrÉÖÅ[
NSOpenGLView ÇÉTÉuÉNÉâÉXâªÇµÇƒÇ¢Ç»Ç¢ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅANSOpenGLContext Çíºê⁄égópǵÅANSOpenGLContext Çà -update ÉÅÉ\ÉbÉhÇí Ç∂ǃÉAÉvÉäÉPÅ[ÉVÉáÉìÉåÉxÉãÇ≈çXêVÇèàóùÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉäÉXÉg 1 ÇÃÉRÅ[ÉhÇÕÅAÉJÉXÉ^ÉÄ OpenGL ÉrÉÖÅ[ÉNÉâÉXÇÃàÍïîÇ≈Ç∑ÅBDZÇÃÉNÉâÉXÇÕÅAÉRÉìÉeÉLÉXÉgçXêVÇÃÉxÅ[ÉXÇΔÇ»ÇÈÉRÅ[ÉãÉoÉbÉNÇíÒãüÇ∑ÇÈ NSViewGlobalFrameDidChangeNotification Ç…ÉIÉuÉUÅ[ÉoÇí«â¡ÇµÇ‹Ç∑ÅBDZÇÃí ímÇÃåãâ ÅANSOpenGLView Ç™éÛÇØéÊÇÈÇÃÇΔìØÇ∂çXêVÅAǬNjÇËï\é¶ÇÃÉäÉTÉCÉYÅAà⁄ìÆÅAç¿ïWÉIÉtÉZÉbÉgÅAÉfÉBÉXÉvÉåÉCê›íËïœçXÇ™çsÇÌÇÍÇ‹Ç∑ÅBDZÇÃÉNÉâÉXÇΔ NSOpenGLView Ç™éÛÇØéÊÇÈÉCÉxÉìÉgÇ…ÇÕÅAé·ä±ÇÃà·Ç¢Ç™Ç†ÇËÇ‹Ç∑ÅB-update ÉÅÉ\ÉbÉhÇÕïKóvÇ»Ç∑Ç◊ǃÇÃèÍçáÅiÉäÉTÉCÉYǻǫÅjÇ…åƒÇ—èoÇ≥ÇÍÇ‹Ç∑Ç™ÅANSView ÇÕÉIÅ[ÉoÅ[ÉâÉCÉhÇ∑ÇÈì¡íËÇÃÉäÉVÉFÉCÉvÉÅÉ\ÉbÉhÇÉGÉNÉXÉ|Å[ÉgǵǻǢÇΩÇflÅA-reshape ÉÅÉ\ÉbÉhÇÕÉTÉCÉYïœçXéûÇ…ÇÕåƒÇ—èoÇ≥ÇÍÇ‹ÇπÇÒÅBÉNÉâÉCÉAÉìÉgÇÕ -drawRect ÉÅÉ\ÉbÉhÇ≈íºê⁄ÉäÉVÉFÉCÉvÇèàóùǵÅAé¿ç€Ç…ÉRÉìÉeÉìÉcÇï`âÊÇ∑ÇÈëOÇ…ÅAï\é¶îÕàÕÇ≈ïœçXÇíTÇ∑DZÇΔÇÇ®ä©ÇflǵNjÇ∑ÅBDZÇÃÉAÉvÉçÅ[É`ÇÕÅANSOpenGLView Çà -reshape ÉÅÉ\ÉbÉhÇégǧÇΔÇ´ÇΔî‰Ç◊ÅAÉpÉtÉHÅ[É}ÉìÉXÇì¡Ç…â¸ëPǵÇΩÇËí·â∫Ç≥ÇπÇΩÇËÇ∑ÇÈLJÇÃÇ≈ÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAìØÇ∂åãâ Ç™ìæÇÁÇÍÇ‹Ç∑ÅBNSView ÇÃÉTÉCÉYïœçXÉçÉWÉbÉNÇ…ÉtÉbÉNÇ∑ÇÈDZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅAï°éGÇ≈džÇËÅAÉJÉXÉ^ÉÄÇà OpenGL ÉrÉÖÅ[ÉNÉâÉXÇç\ízǵǃǢÇÈ OpenGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕí èÌÇÕǪÇÃéËä‘ÇÇ©ÇØÇÈà”ñ°ÇÕdžÇËÇ‹ÇπÇÒÅB
#import <Cocoa/Cocoa.h>
#import <OpenGL/OpenGL.h>
#import <OpenGL/gl.h>
// ÉRÉìÉeÉLÉXÉgçXêVÇÃèàóùï˚ñ@Çé¶Ç∑ÅA
// ÉJÉXÉ^ÉÄ OpenGL ÉrÉÖÅ[ÉNÉâÉXÇÃïîï™ìIÇ»é¿ëï
@class NSOpenGLContext, NSOpenGLPixelFormat;
@interface CustomOpenGLView : NSView
{
@private
NSOpenGLContext* _openGLContext;
NSOpenGLPixelFormat* _pixelFormat;
}
- (id)initWithFrame:(NSRect)frameRect
pixelFormat:(NSOpenGLPixelFormat*)format;
// ÉäÉVÉFÉCÉvÇÕÉTÉ|Å[ÉgÇ≥ÇÍǃǢǻǢÇΩÇflÅAdrawRect Ç≈îÕàÕÇçXêV
- (void)update; // à⁄ìÆÅAÉäÉTÉCÉYÅAÉfÉBÉXÉvÉåÉCïœçX
@end
// ---------------------------------
@implementation CustomOpenGLView
- (id)initWithFrame:(NSRect)frameRect
pixelFormat:(NSOpenGLPixelFormat*)format
{
self = [super initWithFrame:frameRect];
if (self != nil) {
_pixelFormat = [format retain];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(_surfaceNeedsUpdate:)
name:NSViewGlobalFrameDidChangeNotification
object:self];
return self;
}
// ---------------------------------
- (void)dealloc
{ // ÉRÉìÉeÉLÉXÉgÇΔÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇçÌèú
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSViewGlobalFrameDidChangeNotification
object:self];
[self clearGLContext];
[_pixelFormat release];
[super dealloc];
}
// ---------------------------------
// NSView ÇÕì¡íËÇÃÉäÉVÉFÉCÉvÉÅÉ\ÉbÉhÇÉGÉNÉXÉ|Å[ÉgǵǻǢÇΩÇflÅAÉäÉVÉFÉCÉvÇÕǻǵ
// ---------------------------------
- (void)update
{
if ([_openGLContext view] == self) {
[_openGLContext update];
}
}
// ---------------------------------
- (void) _surfaceNeedsUpdate:(NSNotification*)notification
{
[self update];
}
@end
|
ÉäÉXÉg 1. NSView Ç©ÇÁîhê∂ǵÇΩÉJÉXÉ^ÉÄÇà OpenGL ÉrÉÖÅ[ÉNÉâÉX
|
GLUT
GLUT ÉtÉåÅ[ÉÄÉèÅ[ÉNÇégǡǃǢÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAGLUT Ç™ÉNÉâÉCÉAÉìÉgÇΔÇÃÇ‚ÇËéÊÇËǻǵÇ≈ìKêÿÇ»ÉRÉìÉeÉLÉXÉgçXêVÇé¿çsÇ∑ÇÈÇΩÇflÅAOpenGL ÉRÉìÉeÉLÉXÉgÇ‚ÉEÉCÉìÉhÉEÇçXêVÇ∑ÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅBDZÇÃÇÊǧǻÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAíPÇ…ÅAÉÜÅ[ÉUÇ©ÇÁÇÃê≥éÆÇ»ÉäÉTÉCÉYÇèàóùÇ∑ÇÈ GLUT ÉäÉVÉFÉCÉvÉRÅ[ÉãÉoÉbÉNÇ…âûìöÇ∑ÇÈDZÇΔÇï€èÿÇ∑ÇÈïKóvǙdžÇÈÇæÇØÇ≈Ç∑ÅB
Carbon ÇÃ AGL
Carbon API ÇégǡǃèëÇ©ÇÍÇΩ OpenGL ÉNÉâÉCÉAÉìÉgÇÃèÍçáÇÕÅAAGL ÉtÉåÅ[ÉÄÉèÅ[ÉNÇégǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBÉhÉçÅ[ÉAÉuÉãÇÃÉäÉTÉCÉYÇΔà⁄ìÆÇÃÉCÉxÉìÉgÇèàóùÇ∑ÇÈç≈LJíPèÉÇ»ï˚ñ@ÇÕÅACarbon ÉCÉxÉìÉgÇóòópÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBÉhÉçÅ[ÉAÉuÉãÇÃÉäÉTÉCÉYÇΔà⁄ìÆÇëŒè€ÇΔÇ∑ÇÈÇÃÇ≈džÇÍÇŒÅAÉEÉCÉìÉhÉEÉCÉxÉìÉgÇà kEventWindowBoundsChanged ÇΔ kEventWindowZoomed ÇèàóùÇ∑ÇÈÇæÇØÇ≈è\ï™Ç≈Ç∑ÅBkEventWindowBoundsChanged ÉCÉxÉìÉgÇÕÅAÅuÉâÉCÉuÅvÇà ÉEÉCÉìÉhÉEÉäÉTÉCÉYÇΔÉEÉCÉìÉhÉEÉhÉâÉbÉOÇÃç€Ç…î≠ê∂Ç∑ÇÈÇΩÇflÅAïKóvÇ»ÉPÅ[ÉXÇÃëÂïîï™Ç™èàóùÇ≥ÇÍÇ‹Ç∑ÅBkEventWindowZoomed ÉEÉCÉìÉhÉEÉCÉxÉìÉgÇÕÅAïtâ¡ìIÇ»ÉEÉCÉìÉhÉEÉYÅ[ÉÄÇÃÉPÅ[ÉXÇèàóùǵNjÇ∑ÅBDZÇÍÇÁÇà Carbon ÉCÉxÉìÉgÇÃè⁄ç◊DžǬǢǃÇÕÅACarbon ÉCÉxÉìÉgÇÃÉhÉLÉÖÉÅÉìÉg ÇΔÅAÅuCarbonEvents.hÅvÉtÉåÅ[ÉÄÉèÅ[ÉNÉwÉbÉ_ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBÉäÉXÉg 2 ÇÃÉRÅ[ÉhÇÕÅADZÇÍÇÁÇÃÉCÉxÉìÉgÅiÇΔǪÇÃëºÅjÇèàóùÇ∑ÇÈíPèÉÇ»ÉEÉCÉìÉhÉEÉCÉxÉìÉgÉnÉìÉhÉâÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅBDZÇÃÉTÉìÉvÉãÇ≈ÇÕÅAÉEÉCÉìÉhÉEÉCÉxÉìÉgÉnÉìÉhÉâÇÕÅAÉäÉXÉg 3 Ç…é¶Ç∑ resizeGL ÉãÅ[É`ÉìÇåƒÇ—èoǵNjÇ∑ÅB
#include <Carbon/Carbon.h>
// íçÅFÉTÉ|Å[ÉgÉãÅ[É`ÉìÇà handleWindowUpdate()ÅAdisposeGL()ÅA
// buildGL() ÇÕì«é“ÇÃï˚Ç÷ÇÃâ€ëËÇΔǵǃécǵǃǮÇ≠
// resizeGL() ÇÕÉäÉXÉg 3 Ç…é¶Ç∑
static pascal OSStatus windowEvtHndlr (EventHandlerCallRef myHandler,
EventRef event,
void* userData)
{
WindowRef window;
AGLContext aglContext = (AGLContext) userData; // ÉRÉìÉeÉLÉXÉgÇÃÉXÉgÉåÅ[ÉW
Rect rectPort = {0,0,0,0};
OSStatus result = eventNotHandledErr;
UInt32 class = GetEventClass (event);
UInt32 kind = GetEventKind (event);
GetEventParameter(event, kEventParamDirectObject, typeWindowRef,
NULL, sizeof(WindowRef), NULL, &window);
if (window) {
GetWindowPortBounds (window, &rectPort);
}
switch (class) {
// ëºÇÃéÌófiÇÃÉCÉxÉìÉgÇDZDZÇ≈èàóù
case kEventClassWindow:
switch (kind) {
case kEventWindowActivated: // ÉNÉäÉbÉNãNìÆÅAç≈èâÇÃÉtÉâÉbÉVÉÖÇ
// ñhÇÆÇΩÇflÇ…ÅAç≈èâÇÕà”ê}ìIÇ…í âfl
case kEventWindowDrawContent:
// ÉEÉCÉìÉhÉEçXêVä÷êîÇåƒÇ—èoÇ∑ÅAÇΩÇΔǶnj...
handleWindowUpdate(window);
break;
case kEventWindowClose: // ÉEÉCÉìÉhÉEÇ™ï¬Ç∂ÇÁÇÍǃǢÇÈÅiÉNÉçÅ[ÉYÉ{ÉbÉNÉXÅj
HideWindow (window);
// OpenGL ÇÃîjä¸ä÷êîÇåƒÇ—èoÇ∑ÅAÇΩÇΔǶnj...
disposeGL (window);
break;
case kEventWindowShown: // ç≈èâÇÃï\é¶Åiç≈è¨âªÇÃâèúà»äOÅj
// OpenGL ÇÃÉZÉbÉgÉAÉbÉvä÷êîÇåƒÇ—èoÇ∑ÅAÇΩÇΔǶnj...
buildGL (window);
if (window == FrontWindow ())
SetUserFocusWindow (window);
InvalWindowRect (window, &rectPort);
break;
case kEventWindowBoundsChanged: // ÉäÉTÉCÉYÇΔà⁄ìÆÅiÉhÉâÉbÉOÅj
resizeGL (window, aglContext);
// ÉEÉCÉìÉhÉEçXêVä÷êîÇåƒÇ—èoÇ∑ÅAÇΩÇΔǶnj...
handleWindowUpdate(window); // ÉâÉCÉuÉäÉTÉCÉYÇÃÇΩÇflÇ…ã≠êßìIÇ…çXêV
// íçà”ÅFÉEÉCÉìÉhÉEÇÃçƒï`âÊÇ™íxÇ¢ÇΔÉhÉâÉbÉOÇÃÉpÉtÉHÅ[É}ÉìÉXÇ…âeãøÇ∑ÇÈ
break;
case kEventWindowZoomed: // ÉÜÅ[ÉUÇ™ÉYÅ[ÉÄÉ{É^ÉìÇÉNÉäÉbÉN
resizeGL (window, aglContext);
break;
}
break;
}
return result;
}
|
ÉäÉXÉg 2. Carbon ÉEÉCÉìÉhÉEÉCÉxÉìÉgÉnÉìÉhÉâ
|
ÉRÉìÉeÉLÉXÉgçXêVÇèàóùÇ∑ÇÈé¿ç€ÇÃÉRÅ[ÉhÇÉäÉXÉg 3 Ç…é¶ÇµÇ‹Ç∑ÅBǪÇÃç≈LJíPèÉÇ»å`éÆÇ≈ÅADZÇÃÉRÅ[ÉhÇÕÅAëŒè€ÇÃÉRÉìÉeÉLÉXÉgÇ™ aglSetCurrentContext Ç≈åªç›ÇÃÉRÉìÉeÉLÉXÉgÇ…Ç»ÇÈDZÇΔÇï€èÿǵÅAǪÇÃÉRÉìÉeÉLÉXÉgÇ…ëŒÇµÇƒ aglUpdateContext ÇåƒÇ—èoǵNjÇ∑ÅBëOèqÇÃÇÊǧDžÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕ glViewport ÇÕåƒÇ—èoǵÅAÉhÉçÅ[ÉAÉuÉãÇÃÉTÉCÉYÇÉRÅ[ÉhÉäÉXÉgÇ…é¶Ç∑ÇÊǧDžåªç›ÇÃÉEÉCÉìÉhÉEÉTÉCÉYÅAÇ‹ÇΩÇÕà”ñ°ÇÃdžÇÈëºÇÃílÇ…çXêVÇ∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBÇ≥ÇÁÇ…ÅAÉNÉâÉCÉAÉìÉgÇÕÅAÉEÉCÉìÉhÉEÇÃÉTÉCÉYÇΔǪÇÃëäëŒìIÇ»ÉWÉIÉÅÉgÉäÇ™ïœçXÇ≥ÇÍǃǩÇÁï`âÊÉãÅ[É`ÉìÇégÇ¡ÇƒÇ‹ÇæçXêVǵǃǢǻǢèÍçáÇ…ÅADZÇÃã@âÔÇóòópǵǃǪÇÃìäâeçsóÒÇçXêVÇ≈Ç´Ç‹Ç∑ÅB
#include <Carbon/Carbon.h>
#include <AGL/agl.h>
#include <OpenGL/OpenGL.h>
// GL ÇÃÉäÉTÉCÉYÇèàóù
// - ÉRÉìÉeÉLÉXÉgÇÃçXêVÇ™ïKóvÇ≈džÇËÅAÉEÉCÉìÉhÉEÉTÉCÉYÇ™ïœçXÇ≥ÇÍÇΩèÍçáÅA
// ÉEÉCÉìÉhÉEÉTÉCÉYÇçXêVǵǃÅAÉrÉÖÅ[É|Å[ÉgÇÉäÉZÉbÉg
void resizeGL (WindowRef window, AGLContext aglContext)
{
Rect rectPort;
aglSetCurrentContext (aglContext);
aglUpdateContext (aglContext);
GetWindowPortBounds (window, &rectPort);
glViewport (0, 0, rectPort.right - rectPort.left,
rectPort.bottom - rectPort.top);
// ïKóvÇ…âûÇ∂ǃÅADZDZÇ≈ìäâeçsóÒÇçXêV
}
|
ÉäÉXÉg 3. Carbon ÉRÉìÉeÉLÉXÉgçXêVÉnÉìÉhÉâ
|
Carbon ÉfÉBÉXÉvÉåÉCê›íËïœçXÇÃèàóùÇÕé·ä±ï°éGÇ≈Ç∑Ç™ÅAîÒèÌÇ…çáóùìIÇ≈Ç∑ÅBÉfÉBÉXÉvÉåÉCê›íËÇÃïœçXÇÕÅADisplay Manager ÉRÅ[ÉãÉoÉbÉNä÷êîÇégǡǃåüèoÇ≈Ç´Ç‹Ç∑ÅBDZÇà API ÇÕ Carbon ÉtÉåÅ[ÉÄÉèÅ[ÉNÇ≈LJóòópâ¬î\Ç≈ÅAǪÇÃÉvÉçÉgÉ^ÉCÉvÇ™ Displays.h ÉwÉbÉ_ÉtÉ@ÉCÉãÇÃíÜDždžÇËÇ‹Ç∑ÅBÉfÉxÉçÉbÉpÇÕÅADMExtendedNotificationProcPtr ÉRÅ[ÉãÉoÉbÉN API Ç…èÄãíǵÇΩÉRÅ[ÉãÉoÉbÉNä÷êîÇópà”Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBéüÇ…ÅANewDMExtendedNotificationUPP Çí Ç∂ǃDZÇÃä÷êîÇ÷Çà UPP (Universal Procedure Pointer) ÇçÏê¨ÇµÅADZÇà UPP Ç Display Manager Çà DMRegisterExtendedNotifyProc Ç…ìoò^ǵNjÇ∑ÅBÉNÉâÉCÉAÉìÉgÇ™ï°êîÇÃÉRÉìÉeÉLÉXÉgÇ‹ÇΩÇÕÉEÉCÉìÉhÉEÇégǡǃǢÇÈèÍçáÇÕÅAÉäÉXÉg 4 Ç…é¶Ç∑ÇÊǧDžÅAÉEÉCÉìÉhÉEÅAÇ‹ÇΩÇÕÉRÉìÉeÉLÉXÉgÇÉÜÅ[ÉUÉfÅ[É^Ç…í«â¡Ç∑ÇÈÇÃÇ™ñÇ…óßǬDZÇΔǙdžÇËÇ‹Ç∑ÅBÉRÅ[ÉãÉoÉbÉNä÷êîé©ëÃÇÕíPèÉǻLJÇÃÇ≈ÅAè„ãLÇÃÉäÉXÉg 3 Ç…é¶Ç∑ÇÊǧDžÉRÉìÉeÉLÉXÉgçXêVÉãÅ[É`ÉìÇÃåƒÇ—èoǵǩÇÁÇ»ÇËÅAÉtÉãÉEÉCÉìÉhÉEÇÃÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgãÈå`Çñ≥å¯Ç…ǵǃçXêVÉCÉxÉìÉgÇã≠êßǵNjÇ∑ÅBÉRÅ[ÉãÉoÉbÉNÇ…ëóÇÁÇÍÇÈÉÅÉbÉZÅ[ÉWÉ^ÉCÉvÇΔǵǃ kDMNotifyEvent ÇíTÇ∑DZÇΔÇ…ÇÊǡǃÅAÉCÉxÉìÉgÇ™é¿ç€Ç…Åuí ímÅvÉCÉxÉìÉgÇ≈džÇÈDZÇΔÇïKÇ∏ämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBí ímÉCÉxÉìÉgà»äODžLJÅAÉRÉìÉeÉLÉXÉgçXêVÇÃèàóùÇ≈ÉNÉâÉCÉAÉìÉgÇ™ëŒèàÇ∑ÇÈïKóvÇÃǻǢ Display Manager ÉCÉxÉìÉgǙdžÇËÇ‹Ç∑ÅBÉäÉXÉg 4 Ç…ÇÕÅAÉRÅ[ÉãÉoÉbÉNÅAUPP ÇÃçÏê¨ÇΔìoò^ÅAǪǵǃç≈å„Ç…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ Display Manager ÇÃí ímÇïKóvÇΔǵǻÇ≠ǻǡÇΩèÍçáÇÃÅADisposeDMExtendedNotificationUPP Ç…ÇÊÇÈ UPP ÇÃîjä¸Çé¶ÇµÇ‹Ç∑ÅB
#include <Carbon/Carbon.h>
#include <AGL/agl.h>
// ÉRÉìÉeÉLÉXÉgÇÕ userData Çí Ç∂ǃìnÇ≥ÇÍÇÈ
void handleWindowDMEvent (void *userData, short msg, void *notifyData)
{
AGLContext aglContext = (AGLContext) userData; // ÉRÉìÉeÉLÉXÉgÇÃÉXÉgÉåÅ[ÉW
if (kDMNotifyEvent == msg) { // ïœçXí ímÇÃÇ›ÇëóÇÈ
resizeGL (window, agContext); // ÉRÉìÉeÉLÉXÉgÇÃçXêVÇΔÉäÉTÉCÉYÇÃèàóù
GetWindowPortBounds (window, &rectPort);
InvalWindowRect (window, &rectPort); // ã≠êßìIÇ…çƒï`âÊ
}
}
// ---------------------------------
void setupDMNotify (WindowRef window)
{
// ÉfÉBÉXÉvÉåÉCê›íËÇ™ïœçXÇ≥ÇÍÇΩÇΔÇ´Ç…ïKÇ∏í ímÇ≥ÇÍÇÈÇÊǧDžÇ∑ÇÈ
gWindowEDMUPP = NewDMExtendedNotificationUPP (handleWindowDMEvent);
DMRegisterExtendedNotifyProc (gWindowEDMUPP, (void *)window, NULL, &psn);
}
// ---------------------------------
OSStatus disposeDM Notify (WindowRef window)
{
if (gWindowEDMUPP) { // DM í ímÇà UPP Çîjä¸
DisposeDMExtendedNotificationUPP (gWindowEDMUPP);
gWindowEDMUPP = NULL;
}
}
|
ÉäÉXÉg 4. Display Manager í ímÉnÉìÉhÉâ
|
ÉtÉãÉXÉNÉäÅ[ÉìÇà AGL ÇΔ CGL
ÉtÉãÉXÉNÉäÅ[ÉìÇà AGL ÇΔ CGL ÇégópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍçáÇÕÅAçÏãΔÇÕLJǧè≠ǵíPèÉÇ…Ç»ÇËÇ‹Ç∑ÅBÉhÉçÅ[ÉAÉuÉãÇÃà íuÇ™å≈íËÇ≥ÇÍÅAÉTÉCÉYÇÕÉfÉBÉXÉvÉåÉCê›íËÇ…íºê⁄åãÇ—ïtǢǃǮÇËÅADZÇÃê›íËÇ™ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃêßå‰â∫DždžÇÈÇΩÇflÅAÉtÉãÉXÉNÉäÅ[ÉìÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕé¿ç€Ç…ê›íËÇïœçXǵÇΩèÍçáÇ…ÅAíPÇ…çXêVÇé¿çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉtÉãÉXÉNÉäÅ[ÉìÉNÉâÉCÉAÉìÉgÇ≈ÇÕÅAÉRÉìÉeÉLÉXÉgçXêVÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ë„ÇÌÇËÇ…ÅAÉtÉãÉXÉNÉäÅ[ÉìÇÉZÉbÉgÇ∑ÇÈåƒÇ—èoǵÇçƒî≠çsÇ∑ÇÈÇæÇØÇ≈Ç∑ÅBÉäÉXÉg 5 ÇΔ 6 ÇÕÅAǪÇÍǺÇÍÉtÉãÉXÉNÉäÅ[ÉìÉRÉìÉeÉLÉXÉgÇÉäÉZÉbÉgÇ∑ÇÈ AGL ÉãÅ[É`ÉìÇΔ CGL ÉãÅ[É`ÉìÇÃó·Ç≈Ç∑ÅBAGL ÇÃèÍçáÇÕÅAaglSetFullScreen ä÷êîÇ™ÉXÉNÉäÅ[ÉìÉLÉÉÉvÉ`ÉÉÇΔÉfÉBÉXÉvÉåÉCÉäÉTÉCÉYÇèàóùÇ∑ÇÈÇΩÇflÅAresizeGL ÇåƒÇ—èoÇ∑ëOÇ…ÅAóLå¯Ç»ÉtÉãÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇΔÉRÉìÉeÉLÉXÉgÇ™çÏê¨Ç≥ÇÍǃǢÇÈDZÇΔÇï€èÿÇ∑ÇÈïKóvǙdžÇÈÇæÇØÇ≈Ç∑ÅBCGL ÇÃèÍçáÇÕÅACGCaptureAllDisplays ÅACGDisplayBestModeForParametersAndRefreshRate ÅiÇ‹ÇΩÇÕÅAä÷òAÇ∑ÇÈ CGDirectDisplay ä÷êîÅjÅAÇ®ÇÊÇ— CGDisplaySwitchToMode ÇégǡǃÅAóvãÅÇ≥ÇÍÇΩÉfÉBÉXÉvÉåÉCê›íËÇÉZÉbÉgǵÅAéüÇ…ÉfÉBÉXÉvÉåÉCÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇê›íËǵÅAresizeGL ÇåƒÇ—èoǵNjÇ∑ÅBÉäÉXÉg 7 Ç…ÅACGL Ç≈égópÇ≈Ç´ÇÈÇÊǧDž OpenGL Çê›íËÇ∑ÇÈó·Çé¶ÇµÇ‹Ç∑ÅB
íçÅF
AGL_FS_CAPTURE_SINGLE Çê›íËÇπÇ∏Ç… aglSetFullScreen ÇégǧǩÅAÇ‹ÇΩÇÕ CGCaptureAllDisplays ÇégǡǃÇ∑Ç◊ǃÇÃÉfÉBÉXÉvÉåÉCÇÉLÉÉÉvÉ`ÉÉÇ∑ÇÈÇΔÅAÉfÉBÉXÉvÉåÉCê›íËÇ™å≈íËÇ≥ÇÍǃǮÇËÅAâï˙Ç∑ÇÈÇ‹Ç≈ïœÇÌÇÁǻǢÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕ Display Manager ÇÃí ímÇéÛÇØéÊÇËÇ‹ÇπÇÒÅBÉNÉâÉCÉAÉìÉgÇ™ÅAÇ∑Ç◊ǃÇÃÉfÉBÉXÉvÉåÉCÇÉLÉÉÉvÉ`ÉÉǵǃǢǻǢèÍçáÅAÉLÉÉÉvÉ`ÉÉÇ≥ÇÍǃǢǻǢÉfÉBÉXÉvÉåÉCÇÃÉfÉBÉXÉvÉåÉCê›íËÇÃïœçXÇÕàÀëRÇΔǵǃéÛÇØéÊÇËÇ‹Ç∑ÅBDZÇÃÇÊǧǻí ímÇÕÅAåªç›ÇÕÉfÉBÉXÉvÉåÉCÇ…ÇÕégópÇ≥ÇÍǃǮÇÁÇ∏ÅAÉtÉãÉXÉNÉäÅ[ÉìÇà OpenGL ÇÃèàóùÇÃëŒè€Ç≈ÇÕǻǢÇΩÇflÅAí èÌÅAÉtÉãÉXÉNÉäÅ[ÉìÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅADZÇÃÇÊǧǻÉfÉBÉXÉvÉåÉCí ímÇèàóùÇ∑ÇÈïKóvǙdžÇËÇ‹ÇπÇÒÅB
|
#include <Carbon/Carbon.h>
#include <AGL/agl.h>
#include <OpenGL/gl.h>
// ÉXÉNÉäÅ[ÉìÇÃÉäÉTÉCÉYÇΔçXêVÇ…ïKóvÇ»ÉRÉìÉeÉLÉXÉgÇèàóùÅB
// ÉtÉãÉXÉNÉäÅ[ÉìÅAégópÇ∑ÇÈíPàÍÇà GDeviceÅAê›íËÇ∑ÇÈÉsÉNÉZÉãê[Ç≥
// ÇéwíËÇ∑ÇÈÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ≈ÉRÉìÉeÉLÉXÉgÇ™çÏê¨Ç≥ÇÍǃ
// Ç¢ÇÈDZÇΔÇëOíÒÇΔÇ∑ÇÈÅB
void resizeGL (AGLContext aglContext, GLSizei height, GLSizei width)
{
GLint displayCaps [3];
if (!aglContext) // óLå¯Ç»ÉRÉìÉeÉLÉXÉgǩǫǧǩÇÉ`ÉFÉbÉN
return;
// ÉRÉìÉeÉLÉXÉgÇ™ämé¿Ç…çXêVÇ≥ÇÍÇÈÇÊǧDžÅAÉhÉçÅ[ÉAÉuÉãÇçƒìxÉAÉ^ÉbÉ`
aglSetCurrentContext (aglContext);
aglSetFullScreen (aglContext, width, height, 0, 0);
// íçà”ÅFê[Ç≥ÇÕÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ≈ê›íËÅAé¸îgêî 0 ÇÕÇ∑Ç◊ǃDžÉ}ÉbÉ`
// 0 ÉfÉBÉXÉvÉåÉCÇÕÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ≈ëIëÇ≥ÇÍÇΩíPàÍÇÃÉfÉBÉXÉvÉåÉCÇëIë
aglGetInteger (aglContext, AGL_FULLSCREEN, displayCaps); // ÉTÉCÉYÇéÊìæ
glViewport (0, 0, displayCaps[0], displayCaps[1]);
// ïKóvÇ…âûÇ∂ǃÅADZDZÇ≈ìäâeçsóÒÇçXêV
}
|
ÉäÉXÉg 5. ÉtÉãÉXÉNÉäÅ[Éì AGL çXêVÇÃèàóù
|
#include <Carbon/Carbon.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
// ÉRÉìÉeÉLÉXÉgÇÃçXêVÇ…ïKóvÇ»çƒÉAÉ^ÉbÉ`ÇèàóùÅB
// ÉtÉãÉXÉNÉäÅ[ÉìÅAégópÇ∑ÇÈíPàÍÇÃÉfÉBÉXÉvÉåÉCÅAê›íËÇ∑ÇÈÉsÉNÉZÉãê[Ç≥
// ÇéwíËÇ∑ÇÈÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇ≈ÉRÉìÉeÉLÉXÉgÇ™çÏê¨Ç≥ÇÍǃ
// Ç¢ÇÈDZÇΔÇëOíÒÇΔÇ∑ÇÈÅB
// Ç≥ÇÁÇ…ÅAÉXÉNÉäÅ[ÉìÇ™ÉLÉÉÉvÉ`ÉÉÇ≥ÇÍÅAóvãÅÇ≥ÇÍÇΩÉTÉCÉYÇ…ê›íËÇ≥ÇÍǃ
// Ç¢ÇÈDZÇΔÇëOíÒÇΔÇ∑ÇÈÅBåƒÇ—èoǵÉãÅ[É`ÉìÇÕé¿ç€ÇÃÉfÉBÉXÉvÉåÉCÉTÉCÉY
// ÇÃê›íËÇé¿ç€Ç…èàóùÇ∑ÇÈÇΩÇflÅADZDZÇ≈ÇÕÉrÉÖÅ[É|Å[ÉgÇÕê›íËÇ≥ÇÍǻǢÅB
void resizeGL (CGLContextObj cglContext)
{
if (!cglContext) // óLå¯Ç»ÉRÉìÉeÉLÉXÉgǩǫǧǩÉ`ÉFÉbÉN
return;
// ÉRÉìÉeÉLÉXÉgÇ™ämé¿Ç…çXêVÇ≥ÇÍÇÈÇÊǧDžÅAÉhÉçÅ[ÉAÉuÉãÇçƒìxÉAÉ^ÉbÉ`
CGLSetCurrentContext (cglContext);
CGLSetFullScreen (cglContext);
}
|
ÉäÉXÉg 6. ÉtÉãÉXÉNÉäÅ[Éì CGL çXêVÇÃèàóù
|
#include <Carbon/Carbon.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
// ÉtÉãÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgÇÃçÏê¨ÅAÉfÉBÉXÉvÉåÉCÉLÉÉÉvÉ`ÉÉÅA
// Ç®ÇÊÇ—ÉäÉTÉCÉYÇÃó·Çé¶Ç∑ÉRÅ[ÉhÅBÇ≥ÇÁÇ…ä÷òAÇ∑ÇÈ
// âèúÉRÅ[ÉhLJé¶Ç∑ÅB
// âèúÇ…égópÇ∑ÇÈÉOÉçÅ[ÉoÉãïœêî
CGDirectDisplayID gDisplay = 0;
CFDictionaryRef gOldDisplayMode = NULL;
GLboolean gOldDisplayModeValid = GL_FALSE;
CGLContextObj buildFullScreenGL (size_t width, size_t height,
size_t depth, CGRefreshRate refresh)
{
CGLContextObj cglContext = 0;
CGLPixelFormatAttribute attribs[] = {kCGLPFADisplayMask, 0,
kCGLPFAFullScreen,
kCGLPFADoubleBuffer,
kCGLPFADepthSize, 16, NULL};
CGLPixelFormatObj pixelFormat = NULL;
long numPixelFormats = 0;
CFDictionaryRef refDisplayMode = 0;
CGRect displayRect;
// ÉfÉBÉXÉvÉåÉCÉÇÅ[ÉhÇê›íË
gDisplay = CGMainDisplayID (); // ÉÅÉCÉìÇÃÉfÉBÉXÉvÉåÉCÇégóp
refDisplayMode = CGDisplayBestModeForParametersAndRefreshRate
(gDisplay, depth, width, height, refresh, NULL);
if (refDisplayMode) {
gOldDisplayMode = CGDisplayCurrentMode (gDisplay);
gOldDisplayModeValid = GL_TRUE;
CGCaptureAllDisplays ();
CGDisplaySwitchToMode (gDisplay, refDisplayMode);
} // ǪÇÍà»äOÇÃåªç›ÇÃÉÇÅ[ÉhÇégóp
// ÉRÉìÉeÉLÉXÉgÇç\íz
attribs[1] = CGDisplayIDToOpenGLDisplayMask (gDisplay); // PF ÉfÉBÉXÉvÉåÉCÇê›íË
CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats);
if (pixelFormat) {
CGLCreateContext (pixelFormat, NULL, &cglContext);
CGLDestroyPixelFormat (pixelFormat);
}
if (cglContext) {
resizeGL (cglContext);
displayRect = CGDisplayBounds (gDisplay);
glViewport (0, 0, displayRect.size.width, displayRect.size.height);
// ïKóvÇ…âûÇ∂ǃÅAìäâeçsóÒÇçXêVÇ≈Ç´ÇÈ
// DZDZÇ≈ OpenGL ÇÃèÛë‘ÇÉZÉbÉgÉAÉbÉv
}
return cglContext;
}
// ---------------------------------
void disposeGL (CGLContextObj cglContext)
{
// ÉRÉìÉeÉLÉXÉgÇÉ_ÉìÉv
CGLSetCurrentContext (NULL);
CGLClearDrawable (cglContext);
if (cglContext)
CGLDestroyContext (cglContext);
// ìKêÿÇ»âëúìxÇ…êÿÇËë÷Ƕ
if (gOldDisplayModeValid)
CGDisplaySwitchToMode(gDisplay, gOldDisplayMode);
gOldDisplayModeValid = GL_FALSE;
CGReleaseAllDisplays ();
}
|
ÉäÉXÉg 7. ÉtÉãÉXÉNÉäÅ[Éì CGL ÉfÉBÉXÉvÉåÉCÇÃê›íËÇΔâèúÇÃó·
|
íçÅF
CGL ÇÕ CGDirectDisplayID ÇÃë„ÇÌÇËÇ…ÅAÉsÉNÉZÉãÉtÉHÅ[É}ÉbÉgëÆê´ÇÃíÜÇ≈ CGOpenGLDisplayMask ÇégǡǃÅAÉtÉãÉXÉNÉäÅ[ÉìÉRÉìÉeÉLÉXÉgÇ…égǧÉfÉBÉXÉvÉåÉCÇéwíËǵNjÇ∑ÅBDZÇÃëÆê´ÇÕ kCGLPFADisplayMask éwíËéqÇΔÅAǪÇÃdžÇΔÇ…é¿ç€ÇÃÉfÉBÉXÉvÉåÉCÉ}ÉXÉNÇë±ÇØÇÈDZÇΔÇ…ÇÊǡǃê›íËǵNjÇ∑ÅBDZÇÃÉ}ÉXÉNÇÕ CGDisplayIDToOpenGLDisplayMask ä÷êîÇégǡǃÅAóvãÅÇ≥ÇÍÇΩÉfÉBÉXÉvÉåÉCÇà CGDirectDisplayID ÇìnÇ∑DZÇΔÇ…ÇÊǡǃå©Ç¬ÇØÇÁÇÍÇ‹Ç∑ÅB
|
óvñÒÇ∑ÇÈÇΔÅAOpenGL API ÇÃÉNÉâÉCÉAÉìÉgÇÕÅAÉåÉìÉ_ÉâÇΔÉWÉIÉÅÉgÉäÇÃïœçXÇ…çáÇÌÇπǃ OpenGL ÉRÉìÉeÉLÉXÉgÇ™çXêVÇ≥ÇÍÇÈDZÇΔÇï€èÿÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÕÉhÉçÅ[ÉAÉuÉãÇÃÉWÉIÉÅÉgÉäÇïœçXÇ∑ÇÈÉCÉxÉìÉgÅiÉTÅ[ÉtÉFÉXÇÃå¥ì_ÅAïùÅAçÇÇ≥ÅAÉsÉNÉZÉãÇÃê[Ç≥ÅAÉhÉçÅ[ÉAÉuÉãÇÃà íuÅAÉfÉBÉXÉvÉåÉCê›íËǻǫÅjÇ…âûìöǵǃÅAÉVÉXÉeÉÄ API Ç‹ÇΩÇÕ ÉNÉâÉCÉAÉìÉgé©êgÇ…ÇÊǡǃèàóùÇ≥ÇÍÇ‹Ç∑ÅBCarbon API ÇÃèÍçáÇÕÅAÉEÉCÉìÉhÉEâªÇ≥ÇÍÇΩÉNÉâÉCÉAÉìÉgÇ≈ÇÕ aglUpdateContext ÇåƒÇ—èoÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBÉtÉãÉXÉNÉäÅ[ÉìÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAaglSetFullScreen Ç‹ÇΩÇÕ CGLSetFullScreen ÇégópǵǃÅAÉtÉãÉXÉNÉäÅ[ÉìÇÃÉhÉçÅ[ÉAÉuÉãÇçƒç\ízÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBNSOpenGLView ÉTÉuÉNÉâÉXÇégópǵǃǢÇÈ Cocoa ÉNÉâÉCÉAÉìÉgÇΔ GLUT ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAçXêVÇÕÉVÉXÉeÉÄ API Ç…ÇÊǡǃèàóùǵNjÇ∑ÅBç≈å„Ç…ÅAÉJÉXÉ^ÉÄÇà OpenGL ÉrÉÖÅ[ÉNÉâÉXÇégópǵǃǢÇÈ Cocoa ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉWÉIÉÅÉgÉäÇÃïœçXÇ™í ímÇ≥ÇÍÇΩÇΔÇ´Ç…ÅANSOpenGLContext Çà -update ÉÅÉ\ÉbÉhÇåƒÇ—èoÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBè„ãLÇÃÉÅÉ\ÉbÉhÇégópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉåÉìÉ_ÉâÇ™ïœçXÇ≥ÇÍÇΩÇËÅAÉÜÅ[ÉUÇ™ÉhÉçÅ[ÉAÉuÉãÇïœçXǵÇΩÇËǵÇΩÇΔÇ´Ç…ñ‚ëËÇ»Ç≠ìÆçÏǵǃÅAó«çDÇ»ÉÜÅ[ÉUëÃå±Çé¿åªÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
[2003 îN 6 åé 19 ì˙]
|